/**
 * 文件工具类
 */
package com.cnfangmao.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.Map;


public class FileUtil {

	/****
	 * 文件是否存在
	 * @param strPath
	 * @return
	 */
	public static boolean FileExists(String strPath)
	{
		boolean bResult=false;
		
		File file=new File(strPath);
		if (file.exists() )
		{
			bResult=true;
		}
		
		return bResult;
	}
	
	public static boolean DeleteFile(String strPath) {
		boolean bResult=false;
		
		File file=new File(strPath);
		if(file.exists()) {
			bResult=file.delete();
		}
		
		return bResult;
	}
	/*****
	 * 得到文件名后缀
	 * @param strPath
	 * @return
	 */
	public static String getFileSuffix(String strPath)
	{
		String strSuffix="";
		
		//if (FileExists(strPath))
		{
			File file=new File(strPath);
			String strName=file.getName();
			int nLastPos=strName.lastIndexOf(".");
			if (nLastPos!=-1)
			{
				strSuffix=strName.substring(nLastPos+1);
			}
		}
		return strSuffix;
	}
	
	/****
	 * 得到文件名
	 */
	public static String getFileName(String strPath)
	{
		String strFile="";
		
		File file=new File(strPath);
		strFile=file.getName();
		return strFile;
	}
	
	/****
	 * 得到文件名(不包含扩展名)
	 */
	public static String getOnlyFileName(String strPath)
	{
		String strFile="";
		
		File file=new File(strPath);
		strFile=file.getName();
		int nPos=strFile.lastIndexOf(".");
		if (nPos!=-1)
		{
			strFile=strFile.substring(0, nPos);
		}
		
		return strFile;
	}
	/*****
	 * 列出目录下所有文件
	 * @param strFolder
	 * @return
	 */
	public static void getFiles(String strFolder, Map<String,String> mapFiles)
	{
		File file=new File(strFolder);
		
		if (file.exists())
		{
			if (file.isDirectory())
			{
				File[] files=file.listFiles();
				for(File fitem:files)
				{
					if (fitem.isDirectory())
					{
						getFiles(fitem.getAbsolutePath(),mapFiles);
					}
					else
					{
						mapFiles.put(fitem.getAbsolutePath(), fitem.getName());
					}
				}
			}
			else if(file.isFile())
			{
				mapFiles.put(file.getAbsolutePath(), file.getName());
			}
		
		}
	}
	
	/****
	 * 删除目录及其子目录和文件
	 * @param strFolder
	 */
	public static void DeleteFolder(String strFolder)
	{
		File file=new File(strFolder);
		
		if (file.exists())
		{
			if (file.isDirectory())
			{
				File[] files=file.listFiles();
				for(File fitem:files)
				{
					if (fitem.isDirectory())
					{
						DeleteFolder(fitem.getAbsolutePath());
					}

					fitem.delete();
				}
				
				file.delete();
			}
			else if(file.isFile())
			{
				file.delete();
			}
		
		}
	}
	
	/***
	 * 创建文件夹
	 * @param strPath
	 * @return
	 */
	public static boolean CreateFolder(String strPath) {
		boolean bResult=false;
		if(!FileExists(strPath)) {
			File file=new File(strPath);
			bResult=file.mkdirs();
		}
		else {		
			bResult=true;
		}
		return bResult;
	}
	 /**
     * 以字节为单位读取文件，常用于读二进制文件，如图片、声音、影像等文件。
     */
    public static void readFileByBytes(String fileName) {
        File file = new File(fileName);
        InputStream in = null;
        try {
            System.out.println("以字节为单位读取文件内容，一次读一个字节：");
            // 一次读一个字节
            in = new FileInputStream(file);
            int tempbyte;
            while ((tempbyte = in.read()) != -1) {
                System.out.write(tempbyte);
            }
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
            return;
        }
        try {
            System.out.println("以字节为单位读取文件内容，一次读多个字节：");
            // 一次读多个字节
            byte[] tempbytes = new byte[100];
            int byteread = 0;
            in = new FileInputStream(fileName);
       //     ReadFromFile.showAvailableBytes(in);
            // 读入多个字节到字节数组中，byteread为一次读入的字节数
            while ((byteread = in.read(tempbytes)) != -1) {
                System.out.write(tempbytes, 0, byteread);
            }
        } catch (Exception e1) {
            e1.printStackTrace();
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e1) {
                }
            }
        }
    }

    /**
     * 以字符为单位读取文件，常用于读文本，数字等类型的文件
     */
    public static void readFileByChars(String fileName) {
        File file = new File(fileName);
        Reader reader = null;
        try {
            System.out.println("以字符为单位读取文件内容，一次读一个字节：");
            // 一次读一个字符
            reader = new InputStreamReader(new FileInputStream(file));
            int tempchar;
            while ((tempchar = reader.read()) != -1) {
                // 对于windows下，\r\n这两个字符在一起时，表示一个换行。
                // 但如果这两个字符分开显示时，会换两次行。
                // 因此，屏蔽掉\r，或者屏蔽\n。否则，将会多出很多空行。
                if (((char) tempchar) != '\r') {
                    System.out.print((char) tempchar);
                }
            }
            reader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            // 一次读多个字符
            char[] tempchars = new char[30];
            int charread = 0;
            reader = new InputStreamReader(new FileInputStream(fileName));
            // 读入多个字符到字符数组中，charread为一次读取字符数
            while ((charread = reader.read(tempchars)) != -1) {
                // 同样屏蔽掉\r不显示
                if ((charread == tempchars.length)
                        && (tempchars[tempchars.length - 1] != '\r')) {
                } else {
                    for (int i = 0; i < charread; i++) {
                        if (tempchars[i] == '\r') {
                            continue;
                        } else {
                            System.out.print(tempchars[i]);
                        }
                    }
                }
            }

        } catch (Exception e1) {
            e1.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (Exception e1) {
                }
            }
        }
    }

	/***
	 * 按文本方式读取内容
	 * @param strFullPath
	 * @return
	 */
	public static String readContent(String strFullPath,String strEncoding)
	{
		String strContent="";
		
		if (FileExists(strFullPath))
		{
	        BufferedReader reader = null;
	        try {
	            reader = new BufferedReader(new InputStreamReader(new FileInputStream(strFullPath),strEncoding));
	            String tempString = "";
	            // 一次读入一行，直到读入null为文件结束
	            while ((tempString = reader.readLine()) != null) {
	                // 显示行号
	            	strContent=strContent+tempString+"\n";
	            }
	            reader.close();
	        } catch (Exception e) {
	            e.printStackTrace();
	        } finally {
	            if (reader != null) {
	                try {
	                    reader.close();
	                } catch (Exception e1) {
	                }
	            }
	        }
		}
		
		return strContent;
	}
}
